home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / pcl / src-16f.lha / ldb / test.c < prev    next >
C/C++ Source or Header  |  1991-11-06  |  7KB  |  265 lines

  1. /* $Header: test.c,v 1.11 91/02/16 01:01:36 wlott Exp $ */
  2. /* Extra random routines for testing stuff. */
  3.  
  4. #include <signal.h>
  5. #ifdef mips
  6. #include <mips/cpu.h>
  7. #endif
  8.  
  9. #include "lisp.h"
  10. #include "ldb.h"
  11.  
  12. static char *signames[] = {
  13.     "<Unused>", "SIGHUP", "SIGINT", "SIGQUIT", "SIGILL", "SIGTRAP",
  14.     "SIGIOT", "SIGEMT", "SIGFPE", "SIGKILL", "SIGBUS", "SIGSEGV",
  15.     "SIGSYS", "SIGPIPE", "SIGALRM", "SIGTERM", "SIGURG", "SIGSTOP",
  16.     "SIGTSTP", "SIGCONT", "SIGCHLD", "SIGTTIN", "SIGTTOU", "SIGIO",
  17.     "SIGXCPU", "SIGXFSZ", "SIGVTALRM", "SIGPROF", "SIGWINCH",
  18.     "SIGUSR1", "SIGUSR2"
  19. };
  20.  
  21. static char *errors[] = ERRORS;
  22.  
  23. #ifdef mips
  24. #define any_reg_sc 16
  25. #define descriptor_reg_sc 17
  26. #define base_char_reg_sc 18
  27. #define sap_reg_sc 19
  28. #define signed_reg_sc 20
  29. #define unsigned_reg_sc 21
  30. #define non_descr_reg_sc 22
  31. #define interior_reg_sc 23
  32. #define single_float_reg_sc 24
  33. #define double_float_reg_sc 25
  34. #endif
  35.  
  36. #ifdef sparc
  37. #define any_reg_sc 11
  38. #define descriptor_reg_sc 12
  39. #define base_char_reg_sc 13
  40. #define sap_reg_sc 14
  41. #define signed_reg_sc 15
  42. #define unsigned_reg_sc 16
  43. #define non_descr_reg_sc 17
  44. #define interior_reg_sc 18
  45. #define single_float_reg_sc 19
  46. #define double_float_reg_sc 20
  47. #endif
  48.  
  49. #ifdef ibmrt
  50. #define any_reg_sc 10
  51. #define descriptor_reg_sc 11
  52. #define base_char_reg_sc 12
  53. #define sap_reg_sc 13
  54. #define signed_reg_sc 14
  55. #define unsigned_reg_sc 15
  56. #define non_descr_reg_sc 16
  57. #define word_pointer_reg_sc 17
  58. #define interior_reg_sc 18
  59. #define single_68881_reg_sc 19
  60. #define double_68881_reg_sc 20
  61. #define single_fpa_reg_sc 21
  62. #define double_fpa_reg_sc 22
  63. #define single_afpa_reg_sc 23
  64. #define double_afpa_reg_sc 24
  65. #endif
  66.  
  67. signal_handler(signal, code, context)
  68. int signal, code;
  69. struct sigcontext *context;
  70. {
  71.     int mask;
  72.     unsigned long *ptr, bad_inst;
  73.     unsigned char *cptr;
  74.     int len, scoffset, sc, offset, ch;
  75.  
  76.     printf("Hit with %s, code = %d, context = 0x%x\n", signames[signal], code, context);
  77.  
  78. #ifdef mips
  79.     if (context->sc_cause & CAUSE_BD)
  80.         ptr = (unsigned long *)(context->sc_pc + 4);
  81.     else
  82.         ptr = (unsigned long *)(context->sc_pc);
  83. #else
  84.     ptr = (unsigned long *)(context->sc_pc);
  85. #endif
  86.  
  87.     bad_inst = *ptr;
  88.  
  89. #ifdef mips
  90.     if ((bad_inst >> 26) == 0 && (bad_inst & 0x3f) == 0xd) {
  91.         /* It was a break. */
  92.         switch ((bad_inst >> 16) & 0x3ff) {
  93. #if 0
  94.         }
  95.     }
  96. #endif
  97. #endif
  98. #ifdef sparc
  99.     if ((bad_inst & 0xc1c00000) == 0) {
  100.         switch (bad_inst & 0x3fffff) {
  101. #if 0
  102.         }
  103.     }
  104. #endif
  105. #endif
  106. #ifdef ibmrt
  107.     if ((bad_inst & 0xffff0000) == 0xcc700000) {
  108.     switch (bad_inst & 0xffff) {
  109. #if 0
  110.     }
  111.     }
  112. #endif
  113. #endif
  114. #if !defined(mips) && !defined(sparc) && !defined(ibmrt)
  115.     if (0) {
  116.     switch (0) {
  117. #endif
  118.             case trap_Halt:
  119.                 printf("%primitive halt called; the party is over.\n");
  120.                 break;
  121.  
  122.             case trap_PendingInterrupt:
  123.                 printf("Pending interrupt trap? This should not happen.\n");
  124.                 break;
  125.  
  126.             case trap_Error:
  127.             case trap_Cerror:
  128.                 cptr = (unsigned char *)(ptr+1);
  129.                 if (*cptr == 0xff)
  130.                     cptr++;
  131.  
  132.                 len = *cptr++;
  133.                 printf("Error: %s\n", errors[*cptr++]);
  134.                 len--;
  135.                 while (len > 0) {
  136.                     scoffset = *cptr++;
  137.                     len--;
  138.                     if (scoffset == 253) {
  139.                         scoffset = *cptr++;
  140.                         len--;
  141.                     }
  142.                     else if (scoffset == 254) {
  143.                         scoffset = cptr[0] + cptr[1]*256;
  144.                         cptr += 2;
  145.                         len -= 2;
  146.                     }
  147.                     else if (scoffset == 255) {
  148.                         scoffset = cptr[0] + (cptr[1]<<8) +
  149.                             (cptr[2]<<16) + (cptr[3]<<24);
  150.                             cptr += 4;
  151.                         len -= 4;
  152.                     }
  153.                     sc = scoffset & 0x1f;
  154.                     offset = scoffset >> 5;
  155.  
  156.                     printf("    SC: %d, Offset: %d", sc, offset);
  157.                     switch (sc) {
  158.                       case any_reg_sc:
  159.                       case descriptor_reg_sc:
  160.                         putchar('\t');
  161.                         brief_print(context->sc_regs[offset]);
  162.                         break;
  163.                       case base_char_reg_sc:
  164.                         ch = context->sc_regs[offset];
  165.                         switch (ch) {
  166.                           case '\n': printf("\t'\\n'\n"); break;
  167.                           case '\b': printf("\t'\\b'\n"); break;
  168.                           case '\t': printf("\t'\\t'\n"); break;
  169.                           case '\r': printf("\t'\\r'\n"); break;
  170.                           default:
  171.                             if (ch < 32 || ch > 127)
  172.                                 printf("\\%03o", ch);
  173.                             else
  174.                                 printf("\t'%c'\n", ch);
  175.                             break;
  176.                         }
  177.                         break;
  178.                       case sap_reg_sc:
  179. #ifdef ibmrt
  180.               case word_pointer_reg_sc:
  181. #endif
  182.                         printf("\t0x%08x\n", context->sc_regs[offset]);
  183.                         break;
  184.                       case signed_reg_sc:
  185.                         printf("\t%ld\n", context->sc_regs[offset]);
  186.                         break;
  187.                       case unsigned_reg_sc:
  188.                         printf("\t%lu\n", context->sc_regs[offset]);
  189.                         break;
  190.                       case non_descr_reg_sc:
  191.                       case interior_reg_sc:
  192.                         printf("\t???\n");
  193.                         break;
  194. #ifndef ibmrt
  195.                       case single_float_reg_sc:
  196.                         printf("\t%g\n",
  197.                                *(float *)&context->sc_fpregs[offset]);
  198.                         break;
  199.                       case double_float_reg_sc:
  200.                         printf("\t%g\n",
  201.                                *(double *)&context->sc_fpregs[offset]);
  202.                         break;
  203. #endif
  204.                       default:
  205.                         printf("\t???\n");
  206.                         break;
  207.                     }
  208.                 }
  209.                 if (code == trap_Cerror) {
  210.                     printf("Hit a break.  Use ``exit'' to continue.\n");
  211. #ifdef mips
  212.                     if (context->sc_cause & CAUSE_BD)
  213.                         emulate_branch(context, *(unsigned long *)context->sc_pc);
  214.                     else
  215.                         context->sc_pc += 4;
  216. #endif
  217. #ifdef sparc
  218.                     context->sc_pc = context->sc_npc;
  219.                     context->sc_npc = context->sc_npc + 4;
  220. #endif
  221.                 }
  222.                 break;
  223.  
  224.             default:
  225.                 printf("Unknown trap type.\n");
  226.                 break;
  227.         }
  228.     }
  229.  
  230.     mask = sigsetmask(0);
  231.  
  232.     ldb_monitor();
  233.  
  234.     sigsetmask(mask);
  235. }
  236.  
  237.  
  238.  
  239. test_init()
  240. {
  241.     install_handler(SIGINT, signal_handler);
  242. #if defined(mips)||defined(ibmrt)
  243.     install_handler(SIGTRAP, signal_handler);
  244. #endif
  245. #ifdef sparc
  246.     install_handler(SIGILL, signal_handler);
  247. #endif
  248. }
  249.  
  250.  
  251. #ifdef mips
  252. cacheflush()
  253. {
  254.     /* This is supposed to be defined, but is not. */
  255. }
  256. #endif
  257.  
  258. lispobj debug_print(string)
  259. lispobj string;
  260. {
  261.     printf("%s\n", ((struct vector *)PTR(string))->data);
  262.  
  263.     return NIL;
  264. }
  265.